﻿Imports StringToolkit
Imports StringToolkit.clsConversao

Public Class Form1

    Dim Teste As New clsConversao
    Dim ValorFormatado As String
    Dim FazCasasRest As String
    Dim FazCasasDec As String
    Dim DecXC As String
    Dim Preservar As String
    Dim BackSpPress As Boolean = False

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim resultado As Boolean
        If VerRetornoStr(Me.txtValor.Text) = False Then
            MsgBox(MsgErro(resultado, Me.txtValor.Text))
            txtValor.Focus()
        Else
            resultado = True
            txtExtenso.Text = Teste.NumberToEuro(txtValor.Text, cboSaida.SelectedIndex, EscolhaIdioma.SelectedIndex)
            txtValor.Focus()
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Activa o Bloqueio das setas do cursor
        Me.KeyPreview = True
        '-------------------------------------
        'Preenche Combobox : Formatar por extenso
        For Each TipoSaida In [Enum].GetValues(GetType(Saida))

            cboSaida.Items.Add(TipoSaida.ToString)
            cboSaida.SelectedIndex = 0

        Next
        'Preenche Combobox : Escolha de Idioma
        For Each TipoIdiomas In [Enum].GetValues(GetType(Idioma))

            EscolhaIdioma.Items.Add(TipoIdiomas.ToString)
            EscolhaIdioma.SelectedIndex = 0

        Next
    End Sub
    ''' <summary>
    ''' Função auxiliar - Simulador de erros
    ''' </summary>
    Public Function VerRetornoStr(ByVal VerificaString As String) As Boolean
        Dim ValorFormatado As String
        Try
            ValorFormatado = Format(Convert.ToDouble(VerificaString), "#,##0.00") 'Exprimenta fazer a formatação
            If ValorFormatado = True Then 'Caso passe na simulação retorna verdadeira a condição
                VerRetornoStr = True
            Else
                VerRetornoStr = False 'Caso passe na simulação retorna falso a condição
            End If
        Catch ex As Exception
            VerRetornoStr = False
        End Try

    End Function
    'Função para ver se os ultimos digitos são ex : 1.256,00
    Public Function Ultimos2Digitos(ByVal VerDigitos As String) As Boolean
        Dim Volver As String
        Try
            Volver = Mid(VerDigitos.ToString, Val(VerDigitos.Length), 1)
            If Volver = "0" AndAlso Volver = "0" Then 'Caso passe na simulação retorna verdadeira a condição
                Ultimos2Digitos = True
            Else
                Ultimos2Digitos = False 'Caso passe na simulação retorna falso a condição
            End If
        Catch ex As Exception
            Ultimos2Digitos = True
        End Try

    End Function
    Public Function Ultimos2Digitos2(ByVal VerDigitos As String) As Boolean
        Dim Volver As String
        Dim volverFim As String
        Try
            Volver = Mid(VerDigitos.ToString, Val(VerDigitos.Length) - 1, 1)
            volverFim = Mid(VerDigitos.ToString, Val(VerDigitos.Length), 1)
            If volverFim = "0" AndAlso Volver = "0" Then 'Caso passe na simulação retorna verdadeira a condição
                Ultimos2Digitos2 = True
            Else
                Ultimos2Digitos2 = False 'Caso passe na simulação retorna falso a condição
            End If
        Catch ex As Exception
            Ultimos2Digitos2 = True
        End Try

    End Function
    ''' <summary>
    ''' Função auxiliar - Mostra erro.
    ''' </summary>
    Public Function MsgErro(ByVal IndicarSeVerdadeiro As Boolean, ByVal ValorCaixa As String) As String
        Dim DizMensagem As String
        Select Case IndicarSeVerdadeiro = False
            Case ValorCaixa = ""
                DizMensagem = "O valor não pode estar Vazio!"
            Case IndicarSeVerdadeiro = False
                DizMensagem = "Valor não válido!"

            Case Else
                DizMensagem = Nothing
        End Select
        MsgErro = DizMensagem
    End Function

    ''' <summary>
    ''' Faz o bloqueio das setas do cursor na caixa de texto de numerário.
    ''' </summary>
    Private Sub txtValor_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtValor.KeyDown

        Dim bHandled As Boolean = False

        Select Case e.KeyCode

            Case Keys.Escape
                txtValor.SelectionLength = 0
                txtValor.Select(txtValor.Text.Length, 0)
                e.Handled = True
            Case Keys.Left
                txtValor.SelectionLength = 0
                txtValor.Select(txtValor.Text.Length, 0)
                e.Handled = True
            Case Keys.Up
                txtValor.SelectionLength = 0
                txtValor.Select(txtValor.Text.Length, 0)
                e.Handled = True
            Case Keys.Down
                txtValor.SelectionLength = 0
                txtValor.Select(txtValor.Text.Length, 0)
                e.Handled = True
        End Select
    End Sub

    ''' <summary>
    ''' Faz a auto-formatação de numerário.
    ''' </summary>
    Private Sub txtvalor_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtValor.KeyPress
        e.Handled = True
        Preservar = Nothing

        Dim tempTXT As TextBox = CType(sender, TextBox)
        'Delimita a caixa de texto para um máximo de 17 caracteres
        If Not e.KeyChar = Chr(Keys.Back) Then
            If txtValor.TextLength > 21 Then
                Exit Sub
            End If
        Else
        End If

        'Agarra o valor da caixa de texto e transporta-a para a variável : Preservar
        If tempTXT.Text <> "" OrElse tempTXT.Tag <> "" Then
            Preservar = tempTXT.Text
        Else
            Preservar = Nothing
        End If

        If e.KeyChar = Chr(Keys.Back) Then '== Caso seja Pressionada a tecla [Escape] : Proceder ás seguintes instruções. ==
            BackSpPress = True 'Diz ao sistema que a tecla Backspace foi pressionada, servindo para actualizar outra rotina
            If tempTXT.Text = "" Then 'Caso a caixa de texto se encontre vazia, sai da rotina destinada ao pressionamento da tecla : [Escape]
                Exit Sub
            End If
            If tempTXT.Text <> "" OrElse tempTXT.Tag <> "" Then
                'Diz ao sistema que a tecla Backspace foi pressionada,tendo em conta que contem valores dentro da caixa de texto.
                BackSpPress = True
                Preservar = tempTXT.Text
                tempTXT.Tag = tempTXT.Text.ToString.Substring(0, tempTXT.Text.Length - 1)
                tempTXT.Tag = Replace(tempTXT.Tag, ".", "")
                tempTXT.Tag = Replace(tempTXT.Tag, "..", "")
                tempTXT.Tag = Replace(tempTXT.Tag, ",", "")
                'Limpa unidades nos valores
            End If
            If tempTXT.Tag IsNot Nothing Then

                If Not tempTXT.Tag.ToString.Length <= 1 Then
                    If Len(tempTXT.Tag) > 4 Then
                        tempTXT.Tag = tempTXT.Tag.ToString.Insert(tempTXT.Tag.ToString.Length - 2, ",")
                        DecXC = Mid(tempTXT.Tag.ToString, Val(tempTXT.Tag.ToString.Length) - 2, 3)
                        FazCasasDec = tempTXT.Tag.ToString.Substring(0, tempTXT.Tag.ToString.Length - 3)
                        tempTXT.Tag = FazCasasDec.ToString
                        For i As Integer = tempTXT.Tag.ToString.Length - 3 To 1 Step -3
                            tempTXT.Tag = tempTXT.Tag.ToString.Insert(i, ".")
                        Next
                        tempTXT.Text = Converter(tempTXT.Tag & DecXC)
                        tempTXT.SelectionLength = 0
                        tempTXT.Select(tempTXT.Text.Length, 0)
                        Exit Sub
                    End If
                    '----------------------------------------------------------------------------
                    If Len(tempTXT.Tag) = 4 Then
                        tempTXT.Text = tempTXT.Tag.ToString.Insert(tempTXT.Tag.ToString.Length - 2, ",")
                        tempTXT.SelectionLength = 0
                        tempTXT.Select(tempTXT.Text.Length, 0)
                        Exit Sub
                    End If
                    If Len(tempTXT.Tag) = 3 Then
                        tempTXT.Text = tempTXT.Tag.ToString.Insert(tempTXT.Tag.ToString.Length - 2, ",")
                        tempTXT.SelectionLength = 0
                        tempTXT.Select(tempTXT.Text.Length, 0)
                        Exit Sub
                    End If
                    If Len(tempTXT.Tag) = 1 Then tempTXT.Text = "0,0" + tempTXT.Tag

                    If Len(tempTXT.Tag) = 2 Then tempTXT.Text = "0" + tempTXT.Tag

                    tempTXT.Text = tempTXT.Tag & DecXC
                End If
            End If

        Else
            If Not Char.IsNumber(e.KeyChar) Then Exit Sub
        End If

        If Not e.KeyChar = Chr(Keys.Back) Then tempTXT.Tag &= e.KeyChar

        If Len(tempTXT.Tag) = 1 Then tempTXT.Text = "0,0" + tempTXT.Tag

        If Len(tempTXT.Tag) = 2 Then
            tempTXT.Text = "0," + tempTXT.Tag
        ElseIf Len(tempTXT.Tag) > 2 Then
            If Not e.KeyChar = Chr(Keys.Back) Then '<= Caso Pressionada qualquer tecla que não o a tecla Escape.
                tempTXT.Text = Converter(tempTXT.Text & e.KeyChar)
            End If
        End If
        If tempTXT.Text = "0,00" Then 'Caso seja valor igual (Zero) , Limpa a caixa de texto. 
            tempTXT.Tag = ""
            tempTXT.Text = ""
            txtExtenso.Text = ""
        End If
        tempTXT.SelectionLength = 0
        tempTXT.Select(tempTXT.Text.Length, 0) 'Posiciona o cursor sempre no final da caixa de texto.
    End Sub
    Public Function Converter(ByVal Numerario As String) As String
        Dim FazCasasDec As String
        Dim DecXC As String
        Dim FormataDinheiro As Double
        Numerario = Replace(Numerario, ".", "")
        Numerario = Replace(Numerario, "..", "")
        Numerario = Replace(Numerario, ",", "")
        If Numerario <> "" And Len(Numerario) >= 2 Then ' Verifica se a variavel está vazia com a clausula >= 2 digitos
            FazCasasDec = Numerario.ToString.Substring(0, Val(Numerario.ToString.Length) - 2) ' Retira o valor total - 2 casas ao numerário
            DecXC = Mid(Numerario.ToString, Val(Numerario.ToString.Length) - 1, 2) ' Restante numerário que pertence ás moedas < que a unidade

            If Double.TryParse(FazCasasDec, FormataDinheiro) Then

                Dim newNum As String = FormataDinheiro.ToString("#,###") ' Formata de modo a fazer a divisão das casas
                If Val(FazCasasDec) = 0 Then ' Caso o valor não seja < que por ex : 1 euro
                    Converter = "0," & DecXC
                Else
                    Converter = newNum & "," & DecXC ' Caso o valor não seja > que por ex : 1 euro
                End If
            Else
                Converter = Nothing ' Caso vazio
            End If
            If Len(Numerario) = 2 Then ' Caso haja só 2 numeros
                Dim SuprimeZeroE As Decimal = DecXC ' Suprime zeros á esquerda e formata numerário
                Converter = SuprimeZeroE & ",00"
            End If

        Else
            Converter = Nothing 'Caso vazio
        End If
        If Len(Numerario) = 1 Then ' Caso haja só 1 numero
            DecXC = Mid(Numerario.ToString, Val(Numerario.ToString.Length), 1)
            Converter = DecXC & ",00"
        End If
    End Function
End Class
